<?php
/**
 * YFWsysモジュール adminクラス
 */

class YFWsys_Admin {
	private $Cache;
	private $MainDOM;

	function __construct () {
		$this->Cache = null;
	}

	public function init () {
		Y('this.modulelist+', YuTori::Create($this, 'moduleList'));
		Y('this.modulereadme+', YuTori::Create($this, 'moduleReadme'));
		Y('this.modulehelp+', YuTori::Create($this, 'moduleHelp'));
		Y('this.moduleinstall+', YuTori::Create($this, 'moduleInstall'));

		Y('this.helperlist+', YuTori::Create($this, 'helperList'));
		Y('this.helperreadme+', YuTori::Create($this, 'helperReadme'));
	}

	/**
	 * 管理画面出力
	 */
	public function call () {
		$DebugFlg = Y('Logger.Debug$');

		// ログインなしモードかどうか
		if (!Y('App.Module.YFWsys.notLogin')) {
			// ログインしていない時はログインテンプレートを出力して終了
			if (Y('Module.loadAction', 'Login') == false) {
				if (Y('Logger.Debug$')) Y('Logger.Debug', '未ログインのため、ログインフォーム出力');
				Y('Module.List.Login.Form.Action+', Y('Request.SERVER.REQUEST_URI'));
				Y('Document.load', 'YFWsys:admin/login');
				return true;
			}
		}
		
		// 特殊動作
		$Act = Y('Request.Get.Admin');
		if ($Act == 'logout') {
			// ログアウト
			Y('Module.loadAction', 'Login', 'logout');
			return Y('Document.Status', '301', Y('Request.Global.Mod'));

		}

		// モジュール情報を取得する
		$this->Cache = Y('Vars.sys.cache', 'yfwsys');
		
		// adminmenuが空の時は作成する。
		if (empty($this->Cache['modinfo'])) {
			if ($DebugFlg) Y('Logger.Debug', 'modinfo捜索');

			$this->Cache['modinfo'] = array();
			$ModuleList = array_merge(scandir (DIR_BASE_SYS.'/modules/default'), scandir (DIR_BASE_SYS.'/modules/extend'));

			$YML = new YamlReader();
			foreach ($ModuleList as $Module) {
				if (!preg_match('/mod(.*)/', basename($Module), $matches)) continue;
				$ModuleName = $matches[1];
				$FilePath = Y('Module.Path', $ModuleName);
	
				if (file_exists($FilePath.'/modinfo.yml')) {
					$this->Cache['modinfo'][$ModuleName] = $YML->Load ($FilePath.'/modinfo.yml');
				} else {
					if ($DebugFlg) Y('Logger.Debug', 'モジュール'.$Module.'のmodinfoがない');
					continue;
				}
			}
		}

		if ($DebugFlg) Y('Logger.Debug', 'adminテンプレート出力');

		// ModInfo一欄の生成
		Y('this.ModInfo+', array());
		foreach ($this->Cache['modinfo'] as $Module=>$ModInfo) {
			Y('this.ModInfo.'.$Module.'+', $ModInfo);
		}

		// キャッシュセット
		Y('Vars.sys.Cache', 'yfwsys', 'modinfo', $this->Cache['modinfo']);		

		// テンプレート生成
		Y('Document.toObject+', Y('Document.load', 'YFWsys:admin/index'));

		// Adminコールの作成
		Y('Request.Global');
		$Rt = true;
		if ($Module = Y('Request.Global.Mod')) {
			if (strcasecmp($Module, 'yfwsys') === 0) {
				$Rt = Y('this.'.Y('Request.Global.Act'));
			} else {
				Y('Module.load', $Module);
				$Rt = Y('Module.list.'.$Module.'.Admin', Y('Request.Global.Act'));
			}
		}

		return true; 
	}

	/**
	 * モジュール一覧を出力
	 */
	public function moduleList () {
		Y('Document.load', 'YFWsys:admin/modulelist', Y('Document.toObject$'));
		return true;
	}

	/**
	 * モジュールのREADMEを出力
	 */
	public function moduleReadme () {
		Y('Document.load', 'YFWsys:admin/modulereadme', Y('Document.toObject$'));
		return true;
	}

	/**
	 * モジュールインストール確認画面を出力
	 */
	public function moduleInstall () {
		Y('Request.Global');
		$Op = Y('Request.Global.Op');
		if (strcasecmp($Op, 'install') === 0) {
			$this->ModuleInstallExe();
		} else {
			Y('Document.load', 'YFWsys:admin/moduleinstall', Y('Document.toObject$'));
		}
		return true;
	}

	/**
	 * モジュールインストールを実行する
	 */
	public function moduleInstallExe () {
		// 通常のDocumentを使用しない
		Y('Document-');
		// 随時出力の設定
		if (ob_get_level()) ob_end_clean ();
		// 良くはないが、DOCTYPEとhtmlを素で出力する
		print ('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">');
		print ('<html>');
		print ('出力バッファ消去...');
		while (ob_get_level()) { ob_end_flush(); }
		print ('完了<br />');
		
		print ('インストール開始<br />');
		$Module = Y('Request.Global.Act');
		print ('インストール対象:'.$Module.'<br />');

		$ModulePath = Y('Module.Path', $Module);
		print ('モジュールパス:'.$ModulePath.'<br />');

		// install.ymlの読込
		$YML = new YamlReader ();
		if (file_exists ($ModulePath.'/modinfo/install.yml')) {
			print ('インストールスクリプト発見<br />');
		} else {
			print ('インストールスクリプトなし<br />');
			print ('インストール終了<br />');
			print ('</html>');
			return;
		}
		$Install = $YML->Load($ModulePath.'/modinfo/install.yml');

		if ($Install && $sc = count($Install)) {
			print ($sc.'行のコマンドを実行<br />');
			for ($i = 0; $i < $sc; $i++) {
				print ('Line'.$i.':&nbsp;');
				if (!$this->moduleInstallExeCommand ($Install[$i])) break;
			}
		} else {
			print ('インストールコマンドなし<br />');
			print ('</html>');
			return;
		}

		print ('</html>');
	}

	/**
	 * モジュールインストール各コマンド実行
	 */
	private function moduleInstallExeCommand ($Command) {
		if (empty($Command['type'])) {
			print ('インストールコマンドなし<br />');
			return false;
		}

		switch ($Command['type']) {
			case ('database') :
				print ('データベースコマンドを実行<br />');
				Y('Helper.loadAction', 'ConnectDB', $Command);
				if (!empty($Command['output'])) {
					print ('output: '.$Command['output'].'<br />');
				}
				break;
			case ('object') :
				print ('オブジェクトコマンドを実行<br />');
				if (!empty($Command['output'])) {
					print ('output: '.$Command['output'].'<br />');
				}
				break;
			default:
				print ('未対応のコマンドを検出:'.$Command['type'].'<br />');
				break;
		}
		return true;
	}


	/**
	 * ヘルパー一覧を出力
	 */
	public function helperList () {
		Y('Document.load', 'YFWsys:admin/helperlist', Y('Document.toObject$'));
		return true;
	}

	/**
	 * ヘルパーのREADMEを出力
	 */
	public function helperReadme () {
		Y('Document.load', 'YFWsys:admin/helperreadme', Y('Document.toObject$'));
		return true;
	}

}
?>
